package com.alibaba.algo.dao.user;

import com.alibaba.algo.cooperation.feign.vo.req.SelectRoleListByUserReqVO;
import com.alibaba.algo.cooperation.feign.vo.req.SelectRoleUserReqVO;
import com.alibaba.algo.cooperation.feign.vo.req.SelectUserListByRoleIdListReqVO;
import com.alibaba.algo.cooperation.feign.vo.res.RoleUserInfoResVO;
import com.alibaba.algo.cooperation.feign.vo.res.RpcUserInfoVO;
import com.alibaba.algo.cooperation.feign.vo.res.UserRoleInfoResVO;
import com.alibaba.algo.cooperation.usercomponent.vo.req.user.SelectRoleListByUserRequestVO;
import com.alibaba.algo.cooperation.usercomponent.vo.res.user.SelectUserRoleResponseVO;
import com.alibaba.algo.cooperation.usercomponent.vo.res.user.SysUserInfoVO;
import com.alibaba.algo.core.base.BaseMapper;
import com.alibaba.algo.dtos.user.SysRoleUserDTO;
import com.alibaba.algo.entity.user.SysUserRole;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 类SysUserRoleMapper.java的实现描述：用户角色关联Mapper
 *
 * @author nieganggang 2021-03-12 16:08:17
 */
public interface SysUserRoleMapper extends BaseMapper<SysUserRole> {

    /**
     * 查询角色下的用户列表
     *
     * @param sysUserRole 角色标识
     * @param start       分页开始
     * @param end         分页结束
     * @param sortStr     排序字段
     * @return 用户列表
     */
    List<SelectUserRoleResponseVO> selectPage(@Param("sysUserRole") SysUserRole sysUserRole, @Param("start") int start, @Param("end") int end, @Param("sortStr") String sortStr);

    /**
     * 查询当前用户所属的角色列表 有效数据
     *
     * @param userId 用户标识
     * @param sort   排序
     * @return 角色列表
     */
    List<UserRoleInfoResVO> selectRoleListByUserId(@Param("userId") Long userId, @Param("appCode") String appCode, @Param("sort") String sort);

    /**
     * 查询当前用户所属的角色列表 全部数据
     *
     * @param userId 用户标识
     * @param sort   排序
     * @return 角色列表
     */
    List<UserRoleInfoResVO> selectRoleListByUserIdDefaultAll(@Param("userId") Long userId,@Param("sort") String sort,@Param("isDeleted") String isDeleted);

    List<UserRoleInfoResVO> selectRoleListByUserIdAndApp(@Param("userId") Long userId,@Param("employeeCode") String employeeCode,@Param("userAccount") String userAccount,@Param("appCode") String appCode, @Param("sort") String sort);

    /**
     * 根据⻆⾊id获取⽤户列表
     *
     * @param roleId 角色标识
     * @param sort   排序
     * @return 用户列表
     */
    List<RoleUserInfoResVO> selectUserListByRoleId(@Param("roleId") Long roleId, @Param("sort") String sort);

    /**
     * 根据⻆⾊id获取⽤户列表，支持全量查询
     *
     * @param roleId 角色标识
     * @param sort   排序
     * @return 用户列表
     */
    List<RoleUserInfoResVO> selectUserListWithIsDeletedByRoleId(@Param("roleId") Long roleId, @Param("sort") String sort, @Param("isDeleted") String isDeleted);


    /**
     * 根据⻆⾊id获取⽤户列表附带组织信息
     *
     * @param roleId 角色标识
     * @param sort   排序
     * @return 用户列表
     */
    List<RoleUserInfoResVO> selectUserListWithOrgsByRoleId(@Param("roleId") Long roleId, @Param("sort") String sort);

    List<RoleUserInfoResVO> selectUserListWithPrimaryOrgByRoleAndOrgs(@Param("roleId") Long roleId, @Param("orgIds") List<Long> orgIds,  @Param("sort") String sort);

    List<RoleUserInfoResVO> selectUserListWithOrgByRoleAndOrgs(@Param("obj") SelectRoleUserReqVO obj, @Param("sort") String sort);

    List<SysUserInfoVO> selectUserListByRoleId2(@Param("roleId") Long roleId, @Param("sort") String sort);

    Integer deleteByUserId(Long userId);

    Integer updateByUserId(@Param("obj") SysUserRole sysUserRole);

    Integer updateWithIsDeletedByUserIdLastModified(@Param("obj") SysUserRole sysUserRole, @Param("lastModifyTime") LocalDateTime lastModifyTime);
    /**
     * 通过多个角色ID查询用户信息列表
     * @param
     * @param sort
     * @return
     */
    List<RpcUserInfoVO> selectUserListByRoleIdListOrAppCodeList(@Param("vo") SelectUserListByRoleIdListReqVO vo, @Param("sort") String sort);

    /**
     * 查询角色用户信息
     * @param vo
     * @return
     */
    List<SysRoleUserDTO> selectRoleListByUser(@Param("param") SelectRoleListByUserReqVO vo);


    List<UserRoleInfoResVO> selectRoleCodeByUser(@Param("obj") SelectRoleListByUserRequestVO vo);

    void batchInsert(@Param("sysUserRoleList") List<SysUserRole> sysUserRoleList);

    void batchDelete(@Param("sysUserRoleList") List<Long> sysUserRoleList);

    Integer invalidByUserIdAndAppCode(@Param("userId") Long userId, @Param("appCode") String appCode);
}
